#ifndef NETCLIENT_H
#define NETCLIENT_H

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QObject>
#include <QProtobufSerializer>
#include <QWebSocket>

#include "../Debug.h"
#include "../model/data.h"
#include "notify.qpb.h"

namespace model {
class DataCenter;
}

namespace network{

class NetClient : public QObject
{
    Q_OBJECT
public:
    NetClient(model::DataCenter* dataCenter);

    void ping();
////////////////////////////////////////////////
/// 下列都是 WebSocket服务 的操作
////////////////////////////////////////////////
    void initWebsocket ();
    void sendAuthentication();    //  身份验证
    void handleWsResponse(const im::NotifyMessage& notifyMsg);
    void handleWsMessage(const model::Message& msg);
    void handleWsRemoveFriend(const QString& userID);
    void handleWsAddFriendApplyReq(const model::UserInfo& userID); // 告知客户端 发送了好友申请
    void handleWsAddFriendResp(const model::UserInfo& userInfo, bool agree);  // 告知客户端 好友申请处理情况
    void handleWsSessionCreate(const model::chatSessionInfo& chatSession);  // 告知客户端 创建新会话情况
////////////////////////////////////////////////
/// 下列都是 http服务 的操作
////////////////////////////////////////////////
    void getMyself(const QString& loginSessionId);  // 获取个人信息
    void getFriendList(const QString& loginSessionId); // 获取好友信息列表
    void getChatSessionList(const QString& loginSessionId); // 获取会话信息列表
    void getApplyList(const QString& loginSessionId); // 获取好友申请列表
    void getRecentMsgList(const QString& loginSessionId, const QString& chatSessionId, bool isUI);  // 获取服务器上的会话内容
    void sendMessage(const QString& id, const QString& chatSessionId,
                         model::MessageType type,const QByteArray& content, const QString& extraInfo); // 发送消息
    
    void changeNickName(const QString& loginSessionId, const QString& newNick);
    void changeDescription(const QString& loginSessionId, const QString& desciption);
    void changeAvatar(const QString& loginSessionId, const QByteArray& imageByte);
    void changePhone(const QString& loginSessionId, const QString& phoneToChange,
                     const QString& codeId, const QString& code);
    void getVerifyCode(const QString& phone);

    void deleteFriend(const QString& loginSessionId, const QString &userId);
    void addFriendApply(const QString& loginSessionId, const QString &userId);
    void acceptFriendApply(const QString& loginSessionId, const QString &userId);

    void createGroupChatSession(const QString& loginSessionId, const QList<QString>& member);
    void getMemberList(const QString& loginSessionId, const QString &userId);

    void searchUser(const QString& loginSessionId, const QString& searchKey);
    void searchMessage(const QString& loginSessionId, const QString &chatSessionId, const QString &searchKey);
    void searchMessageByTime(const QString& loginSessionId, const QString &chatSessionId,
                             const QDateTime &start, const QDateTime &end);
    
    void userLogin(const QString &username, const QString &password);
    void userRegister(const QString &username, const QString &password);
    void phoneLogin(const QString &phone, const QString &codeID, const QString &code);
    void phoneRegister(const QString &phone, const QString &codeID, const QString &code);
    
    void getSingleFile(const QString& loginSessionId, const QString &fileID);
    void speechConvertText(const QString &loginSessionId, const QString& fileId, const QByteArray& content);

private:
    const QString makeRequestId();

private:
    model::DataCenter* m_dataCenter;

    QNetworkAccessManager m_httpClient;
    QWebSocket m_websocketClient;
    QProtobufSerializer m_serializer;  // 反序列化器

private:
#if TEST_CONNECT_SERVER
    // 192.168.189.131
    QString HTTP_URL = "http://192.168.189.131:9000";
    QString WEBSOCKET_URL = "ws://192.168.189.131:9001/ws";
#endif
signals:
};

} // end network

#endif // NETCLIENT_H
